/*
 * Copyright (c) 2010 Zauber S.A.  -- All rights reserved
 */
package ar.edu.itba.ia2010.geneticos.motor.api.corte;

import java.io.OutputStream;
import java.util.Formatter;
import java.util.Observable;
import java.util.Observer;

import org.apache.commons.lang.Validate;

import ar.edu.itba.ia2010.geneticos.motor.api.Cromosoma;
import ar.edu.itba.ia2010.geneticos.motor.api.FuncionAptitud;
import ar.edu.itba.ia2010.geneticos.motor.api.corte.EvolucionAptitudDecoratorEstrategiaCorte.AgeInformation;
import ar.edu.itba.ia2010.geneticos.motor.api.sintaxistree.Expresion;

/**
 * TODO Descripcion de la clase. Los comenterios van en castellano.
 * 
 * 
 * @author Juan F. Codagnone
 * @since Apr 4, 2010
 */
public class DumpOutputStreamObserver implements Observer {
    private final Formatter writer;
    private final FuncionAptitud<Expresion> funcionAptitud;
    private int age = 1;
    
    /**  Creates the TSVOutputStreamObserver. */
    public DumpOutputStreamObserver(final OutputStream os,
            final FuncionAptitud<Expresion> funcionAptitud) {
        Validate.notNull(os);
        Validate.notNull(funcionAptitud);
        
        this.writer = new Formatter(os);
        this.funcionAptitud =  funcionAptitud;
    }
    
    /** @see Observer#update(Observable, Object) */
    public final void update(final Observable o, final Object arg) {
        final AgeInformation<Expresion> info = (AgeInformation) arg;
        for(final Cromosoma<Expresion> e : info.getPopulation()) {
            writer.format("%04d\t%f\t%s\n", age, funcionAptitud.calcularAptitud(e),
                    e.toString());
        }
        writer.flush();
        age++;
    }

}
